【踩坑指南】Django+channels WebSocket配置

您所在的位置:网站首页 django websocket服务 【踩坑指南】Django+channels WebSocket配置

【踩坑指南】Django+channels WebSocket配置

2023-09-17 23:04| 来源: 网络整理| 查看: 265

目前我搜到网上所有配置Django+channels的教程/博客中,都没有提及这一点。希望能帮助你 踩的坑必须写在最前面: 根据文档的步骤去配置,每次到执行python manage.py 的时,使用的是默认的development server,而不是我们想要的Starting ASGI/Daphne server 在这里插入图片描述

解决办法:在项目的settings.py中 INSTALLED_APPS = [ “daphne”, # 增加daphne这一项,而且必须在channels之前 ‘channels’, ] 出现原因:使用manage.py runserver 命令,默认是执行WSGI的(即使你更新并删除了settings.py中的WSGI),我们必须注册daphne/其他的服务端也可以,这样执行manage.py runserver 命令才会去更改默认的服务器,使用ASGI的。

问题背景:

最近,想去做一个ai训练模型在网页上进行展示,具体实现想法就是,前端发送状态,后端接收,将状态传入已经训练好的基于tensorflow框架下的神经网络模型,返回一个得到的动作,前端执行该动作获得新的状态,前端发送新的状态,如此循环,直至触发停止条件。

对于这种需求 使用http可以解决,但是每次新的状态都去发起请求,这对服务器的负荷是比较重的, 如果你也遇到了这个问题,可以考虑用webSocket去解决。

WebSocket协议: Django+Channels,实现webSocket通信 step1:安装 pip install django>=3.0 pip install channels pip install daphne step2:创建project django-admin startproject WebSocketTest step3: 创建app python manage.py startapp app01 step4:注册Chanels & daphne 这个daphe好多教程都不说,必须加!!! webSocket / settings.py 中添加 INSTALLED_APPS = [ # 其他app 'daphne', # 必须在channels的上面 'channels', # 其他app ] step5:编写asgi.py webSocket / asgi.py import os from channels.routing import ProtocolTypeRouter, URLRouter from django.core.asgi import get_asgi_application from webSocket import routing os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'webSocket.settings') # application = get_asgi_application() application = ProtocolTypeRouter({ 'http': get_asgi_application(), 'websocket': URLRouter(routing.websocket_urlpatterns), }) step6:增加ASGI配置 webSocket / settings.py 中添加 ASGI_APPLICATION = 'webSocket.asgi.application' step7:增加routing 这routing的位置在哪个app里面都可以,这个我就将其放在 webSocket / routing.py from django.urls import path from app01 import consumers websocket_urlpatterns = [ path('room/hony', consumers.ChatConsumer.as_asgi()) ] step8:编写consumers.py 这consumers.py的位置在哪个app里面都可以,这个我就将其放在 app01 / consumers.py from channels.exceptions import StopConsumer from channels.generic.websocket import WebsocketConsumer class ChatConsumer(WebsocketConsumer): def websocket_connect(self, message): self.accept() def websocket_receive(self, message): print(message) self.send("不要") def websocket_disconnect(self, message): raise StopConsumer() step9:运行代码 python manage.py runserver

当出现 在这里插入图片描述 这个的时候,就说明成功了



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3